home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / misc / wt004wc / slice-wc.c < prev    next >
C/C++ Source or Header  |  1994-05-27  |  5KB  |  176 lines

  1. /*
  2. **  wt -- a 3d game engine
  3. **
  4. **  Copyright (C) 1994 by Chris Laurel
  5. **  email:  claurel@mr.net
  6. **  snail mail:  Chris Laurel, 5700 W Lake St #208,  St. Louis Park, MN  55416
  7. **
  8. **  This program is free software; you can redistribute it and/or modify
  9. **  it under the terms of the GNU General Public License as published by
  10. **  the Free Software Foundation; either version 2 of the License, or
  11. **  (at your option) any later version.
  12. **
  13. **  This program is distributed in the hope that it will be useful,
  14. **  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. **  GNU General Public License for more details.
  17. **
  18. **  You should have received a copy of the GNU General Public License
  19. **  along with this program; if not, write to the Free Software
  20. **  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21. */
  22.  
  23. /* Watcom C specific bitmap scaling routines in inline assembly.
  24.  * by Petteri Kangaslampi <pekanga@freeport.uwasa.fi>
  25. */
  26.  
  27.  
  28.  
  29. void WallSlice64(int count, unsigned char *tex_base, fixed tex_dy, Pixel *end,
  30.                  fixed tex_y);
  31. #pragma aux WallSlice64 = \
  32. "t1:    mov     eax,edi"            \
  33. "       shr     eax,26"             \
  34. "       add     edi,edx"            \
  35. "       mov     al,[ecx+eax]"       \
  36. "       mov     [ebx+esi],al"       \
  37. "       sub     ebx,320"            \
  38. "       jns     t1"                 \
  39.     parm    [ebx] [ecx] [edx] [esi] [edi] \
  40.     modify exact [eax edi ebx];
  41.  
  42.  
  43.  
  44. void WallSlice(int count, Pixel *tex_base, fixed tex_dy, Pixel *end,
  45.     fixed tex_y, int npix);
  46. #pragma aux WallSlice = \
  47. "       and     eax,3"              \
  48. "       jz      t4"                 \
  49. "       cmp     eax,1"              \
  50. "       je      t3"                 \
  51. "       cmp     eax,2"              \
  52. "       je      t2"                 \
  53. "t1:    mov     eax,edi"            \
  54. "       shr     eax,25"             \
  55. "       add     edi,edx"            \
  56. "       mov     al,[ecx+eax]"       \
  57. "       mov     [ebx+esi],al"       \
  58. "       sub     ebx,320"            \
  59. "t2:    mov     eax,edi"            \
  60. "       shr     eax,25"             \
  61. "       add     edi,edx"            \
  62. "       mov     al,[ecx+eax]"       \
  63. "       mov     [ebx+esi],al"       \
  64. "       sub     ebx,320"            \
  65. "t3:    mov     eax,edi"            \
  66. "       shr     eax,25"             \
  67. "       add     edi,edx"            \
  68. "       mov     al,[ecx+eax]"       \
  69. "       mov     [ebx+esi],al"       \
  70. "       sub     ebx,320"            \
  71. "t4:    mov     eax,edi"            \
  72. "       shr     eax,25"             \
  73. "       add     edi,edx"            \
  74. "       mov     al,[ecx+eax]"       \
  75. "       mov     [ebx+esi],al"       \
  76. "       sub     ebx,320"            \
  77. "       jns     t1" \
  78.     parm [ebx] [ecx] [edx] [esi] [edi] [eax] \
  79.     modify exact [eax ebx edi];
  80.  
  81.  
  82.  
  83. void FloorSlice128(Pixel *start, unsigned char *tex, fixed x, fixed y,
  84.     fixed dx, fixed dy);
  85. #pragma aux FloorSlice128 = \
  86. "t1:    mov     ecx,edx"            \
  87. "       and     eax,33554431"       \
  88. "       and     ecx,4261412864"     \
  89. "       add     ecx,eax"            \
  90. "       shr     ecx,18"             \
  91. "       add     edx,[esp]"          \
  92. "       mov     cl,[ecx+edi]"       \
  93. "       mov     [ebx],cl"           \
  94. "       inc     ebx"                \
  95. "       add     eax,esi"            \
  96. "       cmp     byte ptr [ebx],255" \
  97. "       je      t1"                 \
  98.     parm [ebx] [edi] [eax] [edx] [esi] caller \
  99.     modify [eax ebx ecx edx];
  100.  
  101.  
  102.  
  103. void FloorSlice(Pixel *start, unsigned char *tex, fixed x, fixed y,
  104.     fixed dx, fixed dy);
  105. #pragma aux FloorSlice = \
  106. "t1:    mov     ecx,edx"            \
  107. "       and     eax,67108863"       \
  108. "       and     ecx,4227858432"     \
  109. "       add     ecx,eax"            \
  110. "       shr     ecx,20"             \
  111. "       add     edx,[esp]"          \
  112. "       mov     cl,[ecx+edi]"       \
  113. "       mov     [ebx],cl"           \
  114. "       inc     ebx"                \
  115. "       add     eax,esi"            \
  116. "       cmp     byte ptr [ebx],255" \
  117. "       je      t1"                 \
  118.     parm [ebx] [edi] [eax] [edx] [esi] caller \
  119.     modify [eax ecx ebx edx];
  120.  
  121.  
  122.  
  123. inline void draw_wall_slice(Pixel *start, Pixel *end, unsigned char *tex_base,
  124.                 fixed tex_y, fixed tex_dy, int fb_width,
  125.                 int tex_height, int npix)
  126. {
  127.     int         count = start - end;
  128.  
  129.     if (npix < 0)
  130.         return;
  131.     if ( tex_height == 64 )
  132.     {
  133.         tex_y <<= 10;
  134.         tex_dy <<= 10;
  135.         WallSlice64(count, tex_base, tex_dy, end, tex_y);
  136.  
  137.     }
  138.     else
  139.     {
  140.      tex_y <<= 9;
  141.      tex_dy <<= 9;
  142.      WallSlice(count, tex_base, tex_dy, end, tex_y, npix);
  143.  
  144.     }
  145. }
  146.  
  147.  
  148.  
  149.  
  150. inline void draw_floor_slice(Pixel *start, unsigned char *tex,
  151.                  fixed x, fixed y, fixed dx, fixed dy,
  152.                  int tex_width)
  153. {
  154.     if ( *start != 255 )
  155.         return;
  156.  
  157.     if ( tex_width == 128 )
  158.     {
  159.         y <<= 9;
  160.         dy <<= 9;
  161.         x <<= 2;
  162.         dx <<= 2;
  163.         FloorSlice128(start, tex, x, y, dx, dy);
  164.     }
  165.     else
  166.     {
  167.  
  168.         y <<= 10;
  169.         dy <<= 10;
  170.         x <<= 4;
  171.         dx <<= 4;
  172.         FloorSlice(start, tex, x, y, dx, dy);
  173.  
  174.     }
  175. }
  176.